当前位置:flash课件吧→免费FLASH教程之三(含实例教程)(新页面 新改版 新气象) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
题 目:Flash中简单跟踪弹的算法 我看到的一些作跟踪弹的方法,都是要用向限的转换,还要考虑子弹和飞机在某个方向保持平行时做一些调整,个人认为有些烦。而我这个用方向向量来计算跟踪弹的方式,无论坐标系如何变,相关的计算只有一个,把速度在X,Y方向的“单位方向向量”计算出来,即可。 学过向量的朋友应该都知道,单位方向向量(x,y),其中的X就是这个向量和X轴的夹角的余弦值,而Y就是正弦值,还等什么,马上行动。 核心代码如下: function Getdistance(mc1, mc2) {//计算了出二者―――子弹和我机的距离 return Math.sqrt((mc1._x-mc2._x)*(mc1._x-mc2._x) (mc1._y-mc2._y)*(mc1._y-mc2._y)); } function StardandlizeAngle(mc1, mc2) {//计算出子弹速度的方向向量。 var l = Getdistance(mc1, mc2); mc1.VdirectionX=(mc2._x-mc1._x)/l;//单位方向向量中的X mc1.VdirectionY=(mc2._y-mc1._y)/l;//单位方向向量中的Y } function doMove(mc){//算出VX,VY,通过mc._x =mc.vx //及mc._y =mc.vy;实现动态效果 mc.vx=mc.v*mc.VdirectionX; mc.vy=mc.v*mc.VdirectionY; mc._x =mc.vx; mc._y =mc.vy; } _root.onEnterFrame=function(){ StardandlizeAngle(bullet,plane); doMove(bullet); } PS:其中对象的属性我是另个在一段AS脚本中用mc.prototype.属性(方法)=function(){[ } 个人比较喜欢用这种方式,尤其是一些物理属性频烦使用时,这就好比是个小的物理属性库了,很的方便。
图片转换AS2.0类(实用型) AS类代码: class ShowImages extends MovieClip { private var myUrl:Array; //存放图片路径的数组 private var myInfo:Array; //存放图片信息的数组 private var showImageBox:MovieClip; //图片显示区域 private var myLoading:MovieClip //加载图片的MC private var topMC:MovieClip; //顶部MC private var buttonMC:MovieClip; //底部MC private var currentTopMC:MovieClip; //记录当前在较高深度的MC private var allowToPlayImage:Boolean = true; private var _id:Number; //定时器ID private var _showtime:Number = 3000; //定时器时长 private var imageID:Number = 0; //自动播放时保存图片ID值 private var myMask:MovieClip; //遮罩MC private var ImageDepth:Number=100; //放置图片MC的深度 private var firstLoadImage:Boolean = true; //是否第一次载入图片 //private static var loaderTextFormat:TextFormat = new TextFormat("Arial", null, 0x000000, true); public var addEventListener:Function; public var removeEventListener:Function; private var dispatchEvent:Function; private static var _mixin1 = EventDispatcher.initialize(ShowImages.prototype); public function ShowImages() { fscommand("allowscale",false); fscommand("showmenu",false); } private function onLoad():Void { //定位至原点 _x = _y = 0; //添加侦听事件 addEventListener("onPhotoListLoad", this); //导入存放图片的XML文档 myUrl = new Array(); //myInfo = new Array(); var me:Object = this; var my_xml = new XML(); my_xml.ignoreWhite = true; my_xml.load("PhotoList.xml"); my_xml.onLoad=function(success){ if (success){ //数组值添加 var xmlA:Array = this.firstChild.childNodes; var xmlALen:Number = xmlA.length; for (var i = 0; i<xmlALen; i ) { me.myUrl.push(xmlA[i].attributes.myUrl); //me.myInfo.push(xmlA[i].attributes.myInfo); } //发出事件给自身 me.dispatchEvent({type:"onPhotoListLoad", target:this}); } } } private function onPhotoListLoad():Void { //先建立放图片的的MC showImageBox = this.createEmptyMovieClip("showImageBox",ImageDepth); myLoading = showImageBox.createEmptyMovieClip("myLoading",ImageDepth 20); topMC = showImageBox.createEmptyMovieClip("topMC", ImageDepth 10); //topMC._x = 200; buttonMC = showImageBox.createEmptyMovieClip("buttonMC", ImageDepth); //导入图片(loadImage是自循环式函数) loadImage(); } private function loadImage():Void { //先取消定时器 clearInterval(_id); //取得对象自身,方便访问 var thisObject:Object = this; //循环控制(这里使用变换深度然后配置遮罩的方法) if ( imageID == myUrl.length ) imageID = 0; //第一次载入图片时无需交换深度 if (firstLoadImage){ currentTopMC = topMC; firstLoadImage = false; }else{ //先交换深度 topMC.swapDepths(buttonMC); //再决定谁在上面 if ( topMC.getDepth() > buttonMC.getDepth() ){ currentTopMC = topMC; }else{ currentTopMC = buttonMC; } } //在上面的MC导入图片,因为遮罩只对处在上面的MC currentTopMC.loadMovie(myUrl[imageID]); //trace(topMC.getDepth()); imageID ; //导入图片 myLoading.onEnterFrame = function() { var lb:Number = thisObject.currentTopMC.getBytesLoaded(); var tb:Number = thisObject.currentTopMC.getBytesTotal(); var percent:Number = Math.round(lb/tb*100); if (percent == 100 and thisObject.currentTopMC.getBytesLoaded()>100 and thisObject.currentTopMC._height>0){ //特效显示图片 thisObject.showOff(thisObject.currentTopMC); //调用定时器控制图片showOff时间 thisObject._id = setInterval(thisObject,"loadImage", thisObject._showtime); //取消onEnterFrame delete this.onEnterFrame; } } } private function showOff(mc:MovieClip):Void { myMask = showImageBox.createEmptyMovieClip("myMask",ImageDepth 30); //随机给出遮罩方法(这个随机数的范围自己给出,大小为任何的方法数量和,我这里给了5种最基本的方法,读者可自行增加) var myRnd:Number = random(5); eval("showOff_" myRnd)(myMask); //showOff_4(myMask); //速度控制 var v:Number = 10; //---------------------------------------------------------------- //方法一(左上至右下) function showOff_0(mc:MovieClip){ drawRectangleAt(mc); mc.onEnterFrame = function(){ if (_width >= Stage.width and _height >= Stage.height ) delete this.onEnterFrame; _width = v; _height = v; } } //方法二(左至右) function showOff_1(mc:MovieClip){ drawRectangleAt(mc); mc._height = Stage.height; mc.onEnterFrame = function(){ if (_width >= Stage.width) delete this.onEnterFrame; _width = v; } } //方法三(上至下) function showOff_2(mc:MovieClip){ drawRectangleAt(mc); mc._width = Stage.width; mc.onEnterFrame = function(){ if (_height >= Stage.height) delete this.onEnterFrame; _height = v; } } //方法四(下至上) function showOff_3(mc:MovieClip){ drawRectangleAt(mc); mc._y = Stage.height; mc._width = Stage.width; mc.onEnterFrame = function(){ if (_height >= Stage.height) delete this.onEnterFrame; _height = v; _y -= v; } } //方法五(右至左) function showOff_4(mc:MovieClip){ drawRectangleAt(mc); mc._x = Stage.width; mc._height = Stage.height; mc.onEnterFrame = function(){ if (_width >= Stage.width) delete this.onEnterFrame; _width = v; _x -= v; } } //-------------------------------------------------------------------------- //函数:画一个矩形,用来进行遮罩时的变形(当然您也能够用attachMovie从库里添加,这样您就能够做各种各样的形状。 //我在这个例子中强调的是脚本) function drawRectangleAt(mc:MovieClip){ with (mc){ lineStyle( 0, 0xffffff, 100 ); beginFill(0xffffff); moveTo( 0, 0 ); lineTo( 0, 10 ); lineTo( 10, 10 ); lineTo( 10, 0 ); lineTo( 0, 0 ); endFill(); } } //配置遮罩 //trace(mc); mc.setMask(myMask); } //setter方法 public function set showtime(i:Number):Void { _showtime = i; } }
6步构造充满动感的角色 STEP 1 让我们先从动作线开始。线条要随意、松散,这样才能更好的表现动作和姿势的感觉。 动作线应该灵活,要避免画直线--那样会使您的角色显得很死板,像木头人相同。 提示:画的时候应该运动整个胳膊,而不但仅是手腕。
STEP 2 在动作线上面添加一些简单的图像。在添加的时候要从三维的角度考虑,像图2那样。 提示:轴线对增加您的三维感觉很有帮助。
3.用线把身体的形状描述出来,一般情况下,我们都会使用圆筒形状。
04:圆筒的形状能够是多样的,我们能够尝试不同形状的圆筒,来达到更多有趣的效果。
05
STEP 5 下面要弄清楚脸的方向。
提示:脖子要一直在身体的前面部分,而且不要放在肩膀上(图5a)。
STEP 6 最后,把衣服挂在身体上,这是画角色的最后一步。
提示:线条要圆滑、松散,这样会使得您的角色充满动感。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|